home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / SCREEN.SWG / 0013_SPEEDVID.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  4KB  |  135 lines

  1. Unit SpeedVid;
  2.  
  3. { High speed Text-video routines For working With binary Files, direct  }
  4. { screen access etc.  (c)1993 Chris Lautenbach                          }
  5. {                                                                       }
  6. { You are hereby permitted to use this routines, so long as you give me }
  7. { credit.  If you modify them, do not distribute the modified version.  }
  8. {                                                                       }
  9. { Notes:   This Unit will work fine in 50 line mode, or on monochrome   }
  10. {          monitors.  Remember; when working in 50 line mode, always    }
  11. {          make sure you call Window(1,1,80,50) so that WindMax is      }
  12. {          updated With the correct screen co-ordinates.  In addition,  }
  13. {          the ScrollScreen() routine is much faster than it's standard }
  14. {          BIOS Int 10h counterpart.                                    }
  15. {                                                                       }
  16. {          Turbo Professional users have no need For FastWrite(),       }
  17. {          VideoMode, or ScreenHeight - since these are approximations  }
  18. {          are provided For use by people who do not have the TpCrt     }
  19. {          Unit.                                                        }
  20. {                                                                       }
  21. { If you need to contact me, I can be found in the NANet, City2City,    }
  22. { and Intelec Pascal echoes - or at my support BBS, Toronto Twilight    }
  23. { Communications (416) 733-9012. Internet: cs911212@iris.ariel.yorku.ca }
  24.  
  25. Interface
  26.  
  27. Uses
  28.   Dos, Crt;
  29.  
  30. Const
  31.   MonoMode : Boolean = False;
  32.  
  33. Type
  34.   ScreenLine = Array[1..160] of Char;
  35.   ScreenBuffer = Array[1..50] of ScreenLine;
  36.   DirectionType = (Up, Down);
  37.  
  38. Var
  39.   VideoScreen : ScreenBuffer Absolute $B800:$0000;
  40.   MonoScreen  : ScreenBuffer Absolute $B000:$0000;
  41.  
  42. Function  VideoMode : Byte;                               { Get video mode }
  43. Function  ScreenHeight : Byte;          { Return height of screen in lines }
  44. Procedure ScrollScreen(Direction : DirectionType); { Scroll screen up/down }
  45. Procedure FastWrite(st:String; x,y,color:Byte);    { Write Text to vid mem }
  46. Procedure RestoreScreen(Var p:Pointer);             { Restore saved screen }
  47. Procedure SaveScreen(Var p:Pointer);            { Save screen to a Pointer }
  48.  
  49. Implementation
  50.  
  51. Function VideoMode : Byte;
  52. Var
  53.   Mode : Byte;
  54. begin
  55.   Asm
  56.     MOV AH, 0Fh              { Set Function to 0Fh - Get current video mode }
  57.     INT 10h                  { Call interrupt 10h - Video Services }
  58.     MOV Mode, AL             { Move INT 10h result to Mode Variable }
  59.   end;
  60.   VideoMode := Mode;
  61. end;
  62.  
  63. Function ScreenHeight:Byte;
  64. begin
  65.   ScreenHeight := (Hi(WindMax) + 1);
  66. end;
  67.  
  68. Procedure ScrollScreen(Direction : DirectionType);
  69. begin
  70.   Case Direction of
  71.     Up   :
  72.       If MonoMode then
  73.         Move(MonoScreen[2],MonoScreen[1],Sizeof(ScreenLine)*(ScreenHeight-1))
  74.       ELSE
  75.         Move(VideoScreen[2],VideoScreen[1],Sizeof(ScreenLine)*(ScreenHeight-1));
  76.     Down :
  77.       If MonoMode then
  78.         Move(VideoScreen[1],VideoScreen[2],Sizeof(ScreenLine)*(ScreenHeight-1))
  79.       ELSE
  80.         Move(VideoScreen[1],VideoScreen[2],Sizeof(ScreenLine)*(ScreenHeight-1));
  81.   end; { Case }
  82. end;
  83.  
  84. Procedure FastWrite(st:String; x,y,color:Byte);
  85. { Write a String directly to the screen, x=column, y=row }
  86. Var
  87.   idx, cdx : Byte;
  88. begin
  89.   idx := x * 2;
  90.   cdx := 1;
  91.   Repeat
  92.     {$R-}
  93.     If MonoMode then
  94.     begin
  95.       MonoScreen[y][idx+2] := Chr(Color);
  96.       MonoScreen[y][idx+1] := St[cdx];
  97.     end
  98.     ELSE
  99.     begin
  100.       VideoScreen[y][idx+2] := Chr(Color);
  101.       VideoScreen[y][idx+1] := St[cdx];
  102.     end;
  103.     {$R+}
  104.     Inc(idx,2);
  105.     Inc(cdx,1);
  106.   Until cdx>=length(st);
  107. end;
  108.  
  109. Procedure RestoreScreen(Var p:Pointer);
  110. begin
  111.  If Assigned(P) then  { make sure this Pointer IS allocated }
  112.  begin
  113.    If MonoMode then
  114.      Move(P^, MonoScreen, 4000)
  115.    ELSE
  116.      Move(P^, VideoScreen, ScreenHeight*SizeOf(ScreenLine));
  117.    FreeMem(P,ScreenHeight*Sizeof(ScreenLine));
  118.  end;
  119. end;
  120.  
  121. Procedure SaveScreen(Var p:Pointer);
  122. begin
  123.   If not Assigned(P) then   { make sure Pointer isn't already allocated }
  124.   begin
  125.     GetMem(P,ScreenHeight*Sizeof(ScreenLine));
  126.     If MonoMode then
  127.       Move(MonoScreen, P^, 4000)
  128.     ELSE
  129.       Move(VideoScreen, P^, ScreenHeight*Sizeof(ScreenLine));
  130.   end;
  131. end;
  132.  
  133.  
  134. begin
  135. end.